#!/usr/bin/perl

# Copyright 2002-2008, Paul Johnson (pjcj@cpan.org)

# This software is free.  It is licensed under the same terms as Perl itself.

# The latest version of this software should be available from my homepage:
# http://www.pjcj.net

use strict;
use warnings;

my @x;

for my $y (0, 0)
{
    for my $z (1, 0)
    {
        if ($y && $z)
        {
            $x[1]++;
        }
        else
        {
            $x[2]++;
        }
        if ($y || $z)
        {
            $x[3]++;
        }
        else
        {
            $x[4]++;
        }

        $y && $x[5]++;
        $x[5]++ if $y;

        $z && $x[6]++;
        $x[6]++ if $z;

        $y || $x[7]++;
        $x[7]++ unless $y;

        $z || $x[8]++;
        $x[8]++ unless $z;

        $y ? $x[9]++  : $x[10]++;
        $z ? $x[11]++ : $x[12]++;

        if ($y)
        {
            $x[13]++;
        }
        elsif ($y && $z)
        {
            $x[14]++;
        }
        elsif ($y || $z)
        {
            $x[15]++;
        }
        else
        {
            $x[16]++;
        }

        $y && $z && $x[17]++; $y && $z && $x[18]++;
    }
}

for my $y (0, 1)
{
    $y || next;
    $x[18]++;
}

for my $y (1, 0)
{
    $y || next;
    $x[19]++;
}

for my $y (0, 1)
{
    $y && next;
    $x[20]++;
}

for my $y (1, 0)
{
    $y && next;
    $x[21]++;
}

for my $y (0, 1)
{
    no warnings "void";
    my $w = $y xor next;
    $x[22]++;
}

for my $y (1, 0)
{
    no warnings "void";
    my $w = $y xor next;
    $x[23]++;
}

for my $y (0, 1)
{
    $y || last;
    $x[24]++;
}

for my $y (1, 0)
{
    $y || last;
    $x[25]++;
}

for my $y (0, 1)
{
    $y && last;
    $x[26]++;
}

for my $y (1, 0)
{
    $y && last;
    $x[27]++;
}

for my $y (0, 1)
{
    no warnings "void";
    my $w = $y xor last;
    $x[28]++;
}

for my $y (1, 0)
{
    no warnings "void";
    my $w = $y xor last;
    $x[29]++;
}

for my $y (0, 1)
{
    $y || goto G1;
    $x[30]++;
}
G1:

for my $y (1, 0)
{
    $y || goto G2;
    $x[31]++;
}
G2:

for my $y (0, 1)
{
    $y && goto G3;
    $x[32]++;
}
G3:

for my $y (1, 0)
{
    $y && goto G4;
    $x[33]++;
}
G4:

for my $y (0, 1)
{
    no warnings "void";
    my $w = $y xor goto G5;
    $x[34]++;
}
G5:

for my $y (1, 0)
{
    no warnings "void";
    my $w = $y xor goto G6;
    $x[35]++;
}
G6:

my $z;

$z = -1;
for my $y (0, 1)
{
    $z++;
    last if $z > 1;
    $z || redo;
    $x[36]++;
}

$z = -1;
for my $y (1, 0)
{
    $z++;
    last if $z > 1;
    !$z || redo;
    $x[37]++;
}

$z = -1;
for my $y (0, 1)
{
    $z++;
    last if $z > 1;
    $z && redo;
    $x[38]++;
}

$z = -1;
for my $y (1, 0)
{
    $z++;
    last if $z > 1;
    !$z && redo;
    $x[39]++;
}

$z = -1;
for my $y (0, 1)
{
    $z++;
    last if $z > 1;
    no warnings "void";
    my $w = $z xor redo;
    $x[40]++;
}

$z = -1;
for my $y (1, 0)
{
    $z++;
    last if $z > 1;
    no warnings "void";
    my $w = !$z xor redo;
    $x[41]++;
}

my $s;
$s = sub
{
    shift || return;
    $x[42]++;
};

for my $y (0, 1)
{
    $s->($y)
}

for my $y (1, 0)
{
    $s->($y)
}

$s = sub
{
    shift && return;
    $x[43]++;
};

for my $y (0, 1)
{
    $s->($y)
}

for my $y (1, 0)
{
    $s->($y)
}

$s = sub
{
    no warnings "void";
    shift xor return;
    $x[44]++;
};

for my $y (0, 1)
{
    $s->($y)
}

for my $y (1, 0)
{
    $s->($y)
}

my ($a, $b) = (0, 1);

if ($a && $b)
{
    print "path 1\n";
}
elsif (!$a && !$b)
{
    print "path 2\n";
}
elsif ($b || 0)
{
    print "path 3\n";
    if (!$b || $a)
    {
        print "path 4\n";
    }
    elsif (!$a && $b)
    {
        print "path 5\n";
    }
}
